#include "widget.h"
#include "ui_widget.h"
//#include "ocr.h"
#include "aip-cpp-sdk-4.16.4/ocr.h"
#include "aip-cpp-sdk-4.16.4/speech.h"
#include <QTimer>//包含QTimer头文件
#include <openssl/evp.h>
#include <QDebug>
#include <QProcess>

extern int flag;

std::string app_id = "31615689";
std::string api_key = "nHX8y8aUaigUMOo8ygFkd0mu";
std::string secret_key = "GoSGahWZ99zi7pTwvPircMHPR0PdzQrz";
aip::Ocr client(app_id, api_key, secret_key);

// 设置APPID/AK/SK
std::string speech_app_id = "32025574";
std::string speech_api_key = "9gZXQhiGRmYR39j9ph45HUnx";
std::string speech_secret_key = "Qz7QokoiFM6ADwe0VR7DyOzksCbmT7v1";
aip::Speech speech_client(speech_app_id, speech_api_key, speech_secret_key);


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    InitCamara();
    mythread = new Mythread(this);
    connect(&timer,SIGNAL(timeout()),this,SLOT(ReadFarme()));
    connect(mythread, SIGNAL(task_signal()), this, SLOT(on_pushButton_clicked()));
    mythread->start();
}

void Widget::InitCamara()
{
    //这句代码的意思是打开video4，括号中的參数仅仅要有:
    // 0 , -1, 202 但要依据你自己的情况改,实測204可以成功打开
    camera = cvCreateCameraCapture(0);
    if (!camera) {
        qDebug() << "Failed to open camera!";
    }
    timer.start(30); //启动定时器，1000为1S ，50为50ms，超时则发出timeoout信号

}


//std::string GetPLateNumber(std::string PicturePath)
//{
//    Json::Value result;
//    std::string image;
//    aip::get_file_content(PicturePath.c_str(), &image);
////    aip::get_file_content("/home/debian/PlateNumber.jpg", &image);

////     如果有可选参数
//    std::map<std::string, std::string> options;
//    options["multi_detect"] = "true";
////    // 带参数调用车牌识别
//    result = client.license_plate(image, options);

//    QString meg = result.toStyledString().data();
//    meg.remove(0, meg.indexOf("number\""));
//    meg.remove(meg.indexOf("}"), meg.length());

//    qDebug() << meg;

//    if(result["error_code"].isNull())
//    {
//          return (result["words_result"][0]["number"].asString() + ",欢迎光临.");
//    }
//    else
//    {
//        return ("识别失败");
//    }
//        return ("识别失败");
//}

void tts(std::string texr, std::string savePath)
{


    std::ofstream ofile;
    std::string file_ret;
    std::map<std::string, std::string> options;
    options["spd"] = "5";
    options["vol"] = "10";
    // 合成成功的二进制数据写入文件中
    ofile.open(savePath, std::ios::out | std::ios::binary);
    // 不带可选参数调用
//    Json::Value result = speech_client.text2audio(texr, aip::null, file_ret);
    // 带可选参数调用, 参数参考参数列表中的可选参数
     Json::Value result = speech_client.text2audio(texr, options, file_ret);
    // 如果file_ret为不为空则说明合成成功，返回mp3文件内容回结果
    if (!file_ret.empty())
    {
        ofile << file_ret;
    } else {
        // 服务端合成错误
        std::cout << result.toStyledString();
    }

}


void Widget::on_pushButton_clicked()
{

    std::string PlateNumber ;
    frame = cvQueryFrame(camera);
    //将图片格式转换成QImage格式，否则不能再lable上显示
    imag = QImage((const uchar*)frame->imageData,
    frame->width,
    frame->height,
    QImage::Format_RGB888).rgbSwapped();
    matFrame = cv::cvarrToMat(frame);  // 转换为 cv::Mat
    cv::imwrite("/home/debian/PlateNumber.jpg", matFrame);

    //把拍下来的照片传递给百度AI接口获取车牌号
    PlateNumber = GetPLateNumber("/home/debian/PlateNumber.jpg");
    /* 语音合成 */
    tts(PlateNumber, "/home/debian/sound.mp3");
    /* 创建新进程，不阻塞当前进程去运行其他任务 */
    QProcess *process = new QProcess();
    process->start("play /home/debian/sound.mp3");

    qDebug() << QString::fromStdString(PlateNumber);
    //设置图片的大小等于label的大小
    imag.scaled(ui->picture->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui->picture->setScaledContents(true);
//    用label显示一张图片
    ui->picture->setPixmap(QPixmap::fromImage(imag));
    //把接口返回来的数据显示到屏幕上
    ui->textBrowser->setText(QString::fromStdString(PlateNumber));
}

std::string Widget::GetPLateNumber(std::string PicturePath)
{
    mythread = new Mythread(this);
    Json::Value result;
    std::string image;
    aip::get_file_content(PicturePath.c_str(), &image);
//    aip::get_file_content("/home/debian/PlateNumber.jpg", &image);

//     如果有可选参数
    std::map<std::string, std::string> options;
    options["multi_detect"] = "true";
//    // 带参数调用车牌识别
    result = client.license_plate(image, options);

    QString meg = result.toStyledString().data();
    meg.remove(0, meg.indexOf("number\""));
    meg.remove(meg.indexOf("}"), meg.length());

    qDebug() << meg;

    if(result["error_code"].isNull())
    {
//        mythread->qt_send('1');
//        write(mythread->fifo_c, "1", 1);
//        mythread->flag = 1;
        flag = 1;
        printf("flag = %d\n",flag);
          return (result["words_result"][0]["number"].asString() + ",欢迎光临.");
    }
    else
    {
//        mythread->qt_send('0');
//        mythread->flag = 2;
        flag = 2;
        printf("flag = %d\n",flag);
//        write(mythread->fifo_c, "0", 1);
        return ("识别失败");
    }
//        mythread->qt_send('0');
//        mythread->flag = 2;
    flag = 2;
        printf("flag = %d\n",flag);
//        write(mythread->fifo_c, "0", 1);
        return ("识别失败");
}


Widget::~Widget()
{
    delete ui;
}

void Widget::ReadFarme()
{

    //从摄像头读取一张图片
    //这个函数cvQueryFrame作用是从摄像头或者文件中抓取一帧
    //参数为视频获取结构也就是我在初始化摄像头声明的CvCapture *camera;
    frame = cvQueryFrame(camera);
    //将图片格式转换成QImage格式，否则不能再lable上显示
    imag = QImage((const uchar*)frame->imageData,
    frame->width,
    frame->height,
    QImage::Format_RGB888).rgbSwapped();
//    //用label显示一张图片
//    //设置图片的大小等于label的大小
    imag.scaled(ui->camera->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui->camera->setScaledContents(true);
    ui->camera->setPixmap(QPixmap::fromImage(imag));

}
